// 平台端：commandHandler.ts
import { createPost } from "@/utils/request";
import type { Response } from "@/mctp-api";
import type { AxiosRequestConfig } from 'axios';
import router from "@/router";

// 1. 固定模块白名单（仅允许指定模块转发）
const ALLOWED_MODULES = ['CalibrationForm', 'TaskForm', 'CreateTaskForm', 'TestForm', 'LoginForm', 'DeviceForm', 'UserForm'] as const;
type ModuleType = typeof ALLOWED_MODULES[number];

// 2. 验证模块合法性
const isValidModule = (moudleType: string): moudleType is ModuleType => {
  return (ALLOWED_MODULES as readonly string[]).includes(moudleType);
};

const createTaskAray = ["StartCreateTask", "CancelCreateTask", "CompleteCreateTask", "OpenTask", "CloseTask"] as const;

/**
 * 平台命令转发核心函数：完全复刻 createPost 的参数结构和逻辑
 * @param moudleType 模块ID（替代 createPost 的 url）
 * @param fixedParams 固定参数（对齐 createPost 的 fixedParams）
 * @param data 业务数据（对齐 createPost 的 data）
 * @param params URL 参数（对齐 createPost 的 params）
 * @param config Axios 配置（对齐 createPost 的 config）
 * @returns 和 createPost 完全一致的 Promise<Response<R>>
 */
export async function handlePluginCommand<
  D extends Record<string, any> = Record<string, any>,
  R = void
>(
  moudleType: string,
  fixedParams?: any,
  data?: D,
  params?: any,
  config: AxiosRequestConfig = {}
): Promise<Response<R>> {
  // 验证模块合法性
  if (!isValidModule(moudleType as ModuleType)) {
    throw new Error(`不支持的模块: ${moudleType}，允许的模块: ${ALLOWED_MODULES.join(', ')}`);
  }

  const { commandName, command } = fixedParams || {};

  const unifiedCommand = commandName || command || "";

  // 如果是跳转，在这里判断
  if (unifiedCommand === "RouterLink") {
    console.log("处理路由跳转命令", data, params, config);
    if (!data) {
      throw new Error('路由跳转必须提供path参数');
    }
    console.log("路由跳转到:", data);
    await router.push(data);

    // 返回成功响应，保持与HTTP请求相同的结构
    return Promise.resolve({
      code: 200,
      msg: '路由跳转成功',
      data: {} as R
    });
  }

  // 1. 获取后端控制器URL（替代 createPost 的 url）

  const controllerName = moudleType.replace('Form', '');
  let controllerUrl = `/api/${controllerName}/SendCommand`;
  if (unifiedCommand === "GetSolutionsByCondition") {
    controllerUrl = `/api/Solution/SendCommand`;
  }
  else if (createTaskAray.includes(unifiedCommand)) {
    controllerUrl = `/api/${controllerName}/${unifiedCommand}`;
  }

  if (unifiedCommand === "OpenTask") {
    console.log("我在这里", unifiedCommand);
  }

  console.log("controllerUrl", controllerUrl);
  // 2. 调用 createPost：参数顺序、类型完全对齐，相当于直接调用原有 HTTP 逻辑
  console.log("fixedParams", fixedParams);
  const apiRequest = createPost<D, R>(controllerUrl, fixedParams);
  return apiRequest(data, params, config);
}